Colegio Universitario de Cartago

Carrera de Big Data

BD-132 Programacion I

Proyecto #2

Realizado por: Mariel Rodriguez , Johel Barquero, Pablo Marín y Wedell Orozco

Docente: Ericka Celina Valverde Navarro

Fecha presentación de investigación: 19 noviembre 2024

Librerias

library(readr)#importación de datos
library(dplyr)#manipulación de datos
library(DT)#tablas interactivas
library(ggplot2)#creación de gráficos
library(tidyr)#Limpieza de datos
library(fmsb)#gráficos de radar etc
library(gridExtra)#Combinar los gráficos
library(plotly)#Graficos interactivos

Set de Datos

#Dataset original jugadores de fifa21
origi_data21 <- read_csv("players_21.csv", col_names = TRUE)
#Dataset original jugadores de fifa22
origi_data22<-read_csv("players_22.csv", col_names = TRUE)
#Dataset original jugadores de fifa15
origi_data15<-read_csv("players_15.csv", col_names = TRUE)

Selección de columnas necesarias:

#Esta función busca las columnas necesarias del dataset original y crea uno nuevo y le agrega una columna nueva de clasificación

fun_dataNecesaria <- function(data) { # Seleccionar columnas deseadas
  data <- data[, c("short_name", "player_positions", "overall", "potential",
                   "value_eur", "age", "club_name", "league_name", "nationality_name",
                   "preferred_foot", "pace", "shooting", "passing", "dribbling",
                   "defending", "physic")] 
  # Agregar columna de clasificación 
  data$clasificacion <- NA
  for (i in 1:nrow(data)) {
    if (data$overall[i] >= 80) {
      data$clasificacion[i] <- "Elite"
    } else if (data$overall[i] >= 60) {
      data$clasificacion[i] <- "Bueno"
    } else {
      data$clasificacion[i] <- "Promedio"
    }
  }
  return(data)
}

Data a utilizar

fdata_15<-fun_dataNecesaria(origi_data15)
fdata_21<-fun_dataNecesaria(origi_data21)
fdata_22<-fun_dataNecesaria(origi_data22)

Conocimiento de los datos

names(origi_data21)#Columnas del set de datos
#Visión general del set de datos
str(origi_data21)
glimpse(origi_data21)

#Nulos set de datos players_21
any(is.na(fdata_21))#Conocimiento de valores nulos
sum(is.na(fdata_21))#Suma total de valores nulos
sapply(fdata_21, function(x) sum(is.na(x)))# Contar valores NA por columna

#Nulos set de datos players_22
any(is.na(fdata_22))#Conocimiento de valores nulos
sum(is.na(fdata_22))#Suma total de valores nulos
sapply(fdata_22, function(x) sum(is.na(x)))# Contar valores NA por columna

Data y dimenciones:

Tablas de los set de datos utilizados años

fdata_21
dim(fdata_21)
## [1] 18944    17
fdata_22
dim(fdata_22)
## [1] 19239    17
fdata_15
dim(fdata_15)
## [1] 16155    17

Hipotesis #1

¿Cuál es la mayor conformación de jugadores “Elite” en las 5 grandes ligas?

Datos de las 5 grandes ligas

#Esta función reune la información de las que consideramos las 5 grandes ligas Spain Primera Division,Premier League, Serie A,Bundesliga,Ligue 1

#Datos de las 5 grandes ligas/ Funcion que busca datos de las 5 grandes ligas 
fun_best_league<-function(data){
  result_five<-data %>% 
  filter(league_name %in% c("Spain Primera Division","English Premier League",                              "Italian Serie A","German 1. Bundesliga",
                            "French Ligue 1") & clasificacion == "Elite" )
  return(result_five)
}
five_data15<-fun_best_league(fdata_15)#Del Dataset ingresado saca data de las 5 grandes ligas

five_data22<-fun_best_league(fdata_22)

Resultado de las mejores ligas

# Función que crea un gráfico de barras interactivo con los resultados de los jugadores élite de cada liga
fun_grafico_jugadores_elite_plotly <- function(data_final, year) {
  # Contar el número de jugadores élite por liga
  data_contada <- data_final %>%
    count(league_name)
  
  # Crear el gráfico de barras interactivo
  barras_plot1 <- plot_ly(
    data = data_contada,
    x = ~league_name,
    y = ~n,  # 'n' es la columna generada por count() que contiene el conteo
    type = 'bar',
    marker = list(color = 'rgba(31, 119, 180, 0.8)', line = list(color = 'rgba(0, 0, 0, 1.0)', width = 1.5)),
    text = ~n,
    textposition = 'auto',
    hoverinfo = 'x+y'
  ) %>%
    layout(
      title = paste("Distribución de jugadores Elite por liga (", year, ")"),
      xaxis = list(
        title = "Ligas",
        tickvals = c("Spain Primera Division", "English Premier League", "Italian Serie A", "German 1. Bundesliga", "French Ligue 1"),
        ticktext = c("La Liga (España)", "Premier League (Inglaterra)", "Serie A (Italia)", "Bundesliga (Alemania)", "Ligue 1 (Francia)"),
        tickangle = -45  
      ),
      yaxis = list(title = "Número de Jugadores"),
      plot_bgcolor = "#C1CDC1"
    )
  
  return(barras_plot1)
}
fun_grafico_jugadores_elite_plotly(five_data15, 2015)
fun_grafico_jugadores_elite_plotly(five_data22,2022)

Comparación final

# Función que crea un gráfico de barras comparativo sobre los jugadores élite por liga
fun_grafico_comparativo_barras_plotly <- function(data1, data2, year1, year2) {
  # Añadir la columna de año a cada conjunto de datos
  data1$year <- as.character(year1)
  data2$year <- as.character(year2)
  
  # Combinar los conjuntos de datos
  union_data <- rbind(data1, data2)
  
  # Agrupar y contar el número de jugadores élite por liga y año
  data_contada <- union_data %>%
    group_by(league_name, year) %>%
    summarise(n = n())
  
  # Crear el gráfico de barras interactivo
  barras_plot2 <- plot_ly(
    data = data_contada,
    x = ~league_name,
    y = ~n,
    color = ~year,
    type = 'bar',
    text = ~paste(n),
    textposition = 'outside',
    hoverinfo = 'text+y'
  ) %>%
    layout(
      title = paste("Comparativa de Jugadores Elite por Liga (", year1, "vs", year2, ")"),
      xaxis = list(
        title = "Ligas",
        tickvals = c("Spain Primera Division", "English Premier League", "Italian Serie A", "German 1. Bundesliga", "French Ligue 1"),
        ticktext = c("La Liga (España)", "Premier League (Inglaterra)", "Serie A (Italia)", "Bundesliga (Alemania)", "Ligue 1 (Francia)"),
        tickangle = -45  
      ),
      yaxis = list(title = "Jugadores Elite"),
      barmode = 'group',  
      plot_bgcolor = "#C1CDC1",
      bargap = 0.2,       
      bargroupgap = 0.1   
    )
  
  return(barras_plot2)
}                     
fun_grafico_comparativo_barras_plotly(five_data15, five_data22, 2015, 2022)

Hipotesis #2

¿Cuánto varia el rango de jugadores respecto a la temporada anterior (21)y la siguiente temporada(22)?

# Dataset original jugadores de FIFA 21
origi_data21 <- read_csv("players_21.csv", col_names = TRUE)
## Rows: 18944 Columns: 110
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (48): player_url, short_name, long_name, player_positions, club_name, l...
## dbl  (60): sofifa_id, overall, potential, value_eur, wage_eur, age, height_c...
## date  (2): dob, club_joined
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Dataset original jugadores de FIFA 22
origi_data22 <- read_csv("players_22.csv", col_names = TRUE)
## Rows: 19239 Columns: 110
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (48): player_url, short_name, long_name, player_positions, club_name, l...
## dbl  (60): sofifa_id, overall, potential, value_eur, wage_eur, age, height_c...
## date  (2): dob, club_joined
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
fun_dataNecesaria <- function(data) {
  data <- data[, c("short_name", "player_positions", "overall", "potential",
                   "value_eur", "age", "club_name", "league_name", "nationality_name",
                   "preferred_foot", "pace", "shooting", "passing", "dribbling",
                   "defending", "physic")]
  data$clasificacion <- ifelse(data$overall >= 80, "Elite", ifelse(data$overall >= 60, "Bueno", "Promedio"))
  return(data)
}

fdata_21 <- fun_dataNecesaria(origi_data21)
fdata_22 <- fun_dataNecesaria(origi_data22)
get_top_players_by_position <- function(data, num_players = 2) {
  data %>%
    filter(clasificacion == "Elite") %>%
    group_by(player_positions) %>%
    arrange(desc(overall)) %>%
    slice_head(n = num_players) %>%
    ungroup()
}

top_players_21 <- get_top_players_by_position(fdata_21)
top_players_22 <- get_top_players_by_position(fdata_22)
# Proporción de clasificaciones por año
get_classification_proportions <- function(data, year) {
  data %>%
    group_by(clasificacion) %>%
    summarise(count = n()) %>%
    mutate(proportion = count / sum(count),
           year = year)
}

classification_21 <- get_classification_proportions(fdata_21, 2015)
classification_22 <- get_classification_proportions(fdata_22, 2022)

# Combinar datos de proporciones
combined_classifications <- rbind(classification_21, classification_22)

# Gráfico circular para 2021
pie_2021 <- plot_ly(classification_21, labels = ~clasificacion, values = ~proportion, type = 'pie',
                    textinfo = 'label+percent', insidetextorientation = 'radial',
                    hoverinfo = 'text',
                    text = ~paste("Clasificación:", clasificacion, "<br>Proporción:", round(proportion * 100, 2), "%")) %>%
  layout(title = "Distribución de Clasificaciones (FIFA 21)")

# Gráfico circular para 2022
pie_2022 <- plot_ly(classification_22, labels = ~clasificacion, values = ~proportion, type = 'pie',
                    textinfo = 'label+percent', insidetextorientation = 'radial',
                    hoverinfo = 'text',
                    text = ~paste("Clasificación:", clasificacion, "<br>Proporción:", round(proportion * 100, 2), "%")) %>%
  layout(title = "Distribución de Clasificaciones (FIFA 22)")

# Mostrar gráficos interactivos
pie_2021
pie_2022

Hipotesis #3

Conforme al potencial actual del jugador¿Cómo evolucionaría en la siguiente temporada?

Habilidades de los jugadores

#Función para crear un nuevo dataframe solo con las habilidades de cada jugador 
fun_habilidades<- function(data){#data == al set de datos a utilizar
 
  data<-data %>% #Creacion de dataframe con las habilidades de los jugadores
  select(short_name,potential, everything()[11:16])

#Limpieza de los datos(Eliminancion de NA no se uso por no tener informacion sobre sus estadisticas)
 data<-data %>% 
  drop_na()
 
 return(data)
}


habilidades_15<-fun_habilidades(fdata_15)#///
habilidades_15

Predicción de habilidades

#Se creo una funcion que tiene como proposito tratar de predicir las habilidades de los jugadores para la siguiente temporada
#2.Dataframe para la prediccion de los jugadores 
fun_predicion_players <- function(data) {
  data<-data %>% 
    drop_na()
  # Seleccionar las columnas específicas
  data <- data %>% 
    select(short_name, potential, pace, shooting, passing, dribbling, defending, physic)
  
  # Evaluar y modificar las columnas de habilidades
  for (i in 1:nrow(data)) { 
    if (data$potential[i] >= 90) { 
      data[i, c("pace", "shooting", "passing", "dribbling", "defending", "physic")] <- 
        data[i, c("pace", "shooting", "passing", "dribbling", "defending", "physic")] + 1 
    } else if (data$potential[i] >= 70) { 
      data[i, c("pace", "shooting", "passing", "dribbling", "defending", "physic")] <- 
        data[i, c("pace", "shooting", "passing", "dribbling", "defending", "physic")] + 2 
    } else if (data$potential[i] >= 60) { 
      data[i, c("pace", "shooting", "passing", "dribbling", "defending", "physic")] <- 
        data[i, c("pace", "shooting", "passing", "dribbling", "defending", "physic")] - 1 
    } else { 
      data[i, c("pace", "shooting", "passing", "dribbling", "defending", "physic")] <- 
        data[i, c("pace", "shooting", "passing", "dribbling", "defending", "physic")] + 0 
    }
  }
  
  return(data)
}

predic_2015<-fun_predicion_players(fdata_15)

head(predic_2015)

Nota general de los jugadores

#3.Funcion que calcular la nota general de las habilidades de un jugador 
fun_overall_player <- function(player, data) {
  # Defenicion de pesos
  pesos <- c(pace = 0.2, shooting = 0.2, passing = 0.2, dribbling = 0.2, defending = 0.1, physic = 0.1)
  
  # Filtrar el dataframe para obtener el jugador específico
  solicitud <- data %>%
    filter(short_name == player)
  
  if (nrow(solicitud) == 0) {
    print("Jugador no encontrado")
  }
  
  # Calcular el overall_habilidad usando sapply
  overall_habilidad <- sapply(1:nrow(solicitud), function(i) {
    sum(as.numeric(solicitud[i, c("pace", "shooting", "passing", "dribbling", "defending", "physic")]) * pesos)
  })
  
  # Crear un dataframe con los resultados deseados
  resultado <- data.frame( short_name = solicitud$short_name, 
                           potential = solicitud$potential,
                           pace = solicitud$pace,
                           shooting = solicitud$shooting,
                           passing = solicitud$passing,
                           dribbling = solicitud$dribbling,
                           defending = solicitud$defending,
                           physic = solicitud$physic,
                           overall_habilidad = overall_habilidad )
  
  return(resultado)
}

fun_overall_player("L. Messi", fdata_15)
fun_overall_player("L. Messi", predic_2015)

Comparativa del desarrollo de la temporada de los jugadores

Graficos Radar

#Se creo esta función que tiene como proposito realizar un grafico radar recibiendo 5 parametros 

#player = Nombre del jugador

#data1 = Primer set de datos a utilizar

#data2 = Segundo set de datos a utilizar

#Year1 = Año del primer set de datos evaluado

#Year2 = Año del segundo set de datos evaluado

# Función que crea un gráfico de radar interactivo
fun_radar_doble_interactivo <- function(player, data1, data2, year1, year2) {
  # Filtrar y seleccionar las columnas específicas para el jugador
  data1 <- data1 %>% 
    filter(short_name == player) %>% 
    select(pace, shooting, passing, dribbling, defending, physic)
  
  data2 <- data2 %>% 
    filter(short_name == player) %>% 
    select(pace, shooting, passing, dribbling, defending, physic)
  
  # Combinar los datos y agregar años 
  vect_data <- rbind(
    cbind(data1, Year = year1),
    cbind(data2, Year = year2)
  )
  
  # Crear el gráfico de radar interactivo
  radar_chart <- plot_ly(
    type = 'scatterpolar',
    fill = 'toself'
  ) %>%
    add_trace(
      r = as.numeric(vect_data[vect_data$Year == year1, 1:6]),
      theta = names(vect_data)[1:6],
      name = as.character(year1)
    ) %>%
    add_trace(
      r = as.numeric(vect_data[vect_data$Year == year2, 1:6]),
      theta = names(vect_data)[1:6],
      name = as.character(year2)
    ) %>%
    layout(
      polar = list(
        radialaxis = list(
          visible = TRUE,
          range = c(0, 100)
        )
      ),
      title = paste("Comparativa de habilidades de", player)
    )
  
  return(radar_chart)
}
#Se realizo una función la cual tiene como proposito recibir 7 parametros en donde el player es el nombre del jugador data1 al 3 es set de datos que queremos evaluar y year1 al 3 el año de la evaluación 

# Función que crea un gráfico de radar interactivo
fun_radar_triple_interactivo <- function(player, data1, data2, data3, year1, year2, year3) {
  # Filtrar y seleccionar las columnas específicas para el jugador
  data1 <- data1 %>% 
    filter(short_name == player) %>% 
    select(pace, shooting, passing, dribbling, defending, physic)
  
  data2 <- data2 %>% 
    filter(short_name == player) %>% 
    select(pace, shooting, passing, dribbling, defending, physic)
  
  data3 <- data3 %>% 
    filter(short_name == player) %>% 
    select(pace, shooting, passing, dribbling, defending, physic)
  
  # Combinar los datos y agregar años
  vect_data <- rbind(
    cbind(data1, Year = year1),
    cbind(data2, Year = year2),
    cbind(data3, Year = year3)
  )
  
  # Crear el gráfico de radar interactivo
  radar_chart <- plot_ly(
    type = 'scatterpolar',
    fill = 'toself'
  ) %>%
    add_trace(
      r = as.numeric(vect_data[vect_data$Year == year1, 1:6]),
      theta = names(vect_data)[1:6],
      name = year1
    ) %>%
    add_trace(
      r = as.numeric(vect_data[vect_data$Year == year2, 1:6]),
      theta = names(vect_data)[1:6],
      name = year2
    ) %>%
    add_trace(
      r = as.numeric(vect_data[vect_data$Year == year3, 1:6]),
      theta = names(vect_data)[1:6],
      name = year3
    ) %>%
    layout(
      polar = list(
        radialaxis = list(
          visible = TRUE,
          range = c(0, 100)
        )
      ),
      title = paste("Comparativa de habilidades de", player)
    )
  
  return(radar_chart)
}

Desarrollo Lionel Messi (Delantero)

Lionel Andrés Messi desarrollo años 2015 y 2022

fun_radar_doble_interactivo("L. Messi", fdata_22, fdata_15, 2022, 2015)

Lionel Messi desarrollo años 2015,2021 y 2022

fun_radar_triple_interactivo("L. Messi", fdata_22, fdata_21, fdata_15, 2022, 2021, 2015)

Desarrollo Virgil van Dijk (Defensa)

Virgil van Dijk desarrollo años 2015 y 2022

fun_radar_doble_interactivo("V. van Dijk", fdata_22, fdata_15, 2022, 2015)

Virgil van Dijk desarrollo años 2015,2021 y 2022

fun_radar_triple_interactivo("V. van Dijk", fdata_22, fdata_21, fdata_15, 2022, 2021, 2015)

Desarrollo Kevin De Bruyne(mediocampista)

Kevin De Bruyne desarrollo años 2015 y 2022

fun_radar_doble_interactivo('K. De Bruyne',fdata_22,fdata_15,2022,2015)

Kevin De Bruyne desarrollo años 2015,2021 y 2022

fun_radar_triple_interactivo('K. De Bruyne',fdata_22,fdata_21,fdata_15,2022,2021,2015)

Hipotesis #4

Conforme a la edad como afectan las habilidades del jugador

Otros graficos

Pie habil de los jugadores

# Crear el gráfico de pastel interactivo
fun_preferred_foot_pie<-function(data1,year){
data_count1<-data1 %>%
  group_by(preferred_foot) %>% 
  count(preferred_foot)

pastel_chart <- plot_ly(
  data = data_count1,
  labels = ~preferred_foot,
  values = ~n,
  type = 'pie',
  textinfo = 'label+percent',
  insidetextorientation = 'radial',
  marker = list(colors = c( "#79CDCD", "#BC8F8F"))
) %>%
  layout(
    title = paste("Distribución pie habil año", year)
  )
return(pastel_chart)
}
fun_preferred_foot_pie(fdata_15,2015)